#include "TaskQueue.h"

TaskQueue::TaskQueue(size_t size)
    : _taskSize{size}
{
}

TaskQueue::~TaskQueue()
{
}

void TaskQueue::addTask(Task *task)
{
    unique_lock<mutex> lock(_mtx);
    while (full())
    {
        _cond.wait(lock);
    }
    _tasks.push(task);
    _cond.notify_all();
}

Task *TaskQueue::front()
{
    unique_lock<mutex> lock(_mtx);
    while (_tasks.empty())
    {
        _cond.wait(lock);
    }

    Task *tmp = _tasks.front();
    _tasks.pop();
    _cond.notify_all();
    return tmp;
}

bool TaskQueue::full()
{
    return _tasks.size() == _taskSize;
}